package cn.kgc.springmvc.controller;

import cn.kgc.springmvc.entity.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

import javax.servlet.http.HttpServletRequest;
import java.util.Arrays;

/**
 * @author 课工场
 * @date 2024/2/27
 * @description 分析springmvc中如何实现参数的接收
 * 1.  String
 * 2. 基本类型  int  float
 * 3. 包装类型的参数
 * 4. 自定义类型   User
 * 5. 数组类型
 * <p>
 * get   ->  /param/m1?username=tom&password=123
 */
@Controller
@RequestMapping("param")
public class ParamController {

    @RequestMapping("m1")
    public String method1(HttpServletRequest request) {

        String username = request.getParameter("username");
        System.out.println("username = " + username);
        String password = request.getParameter("password");
        System.out.println("password = " + password);

        return "hello";
    }


    /**
     * @param username 参数的名字需要和请求参数中的key保持一致  默认规则
     * @param password 形式参数名字和请求参数中的key名字不一致
     *                 解决方案     @RequestParam("uname")  指定key和形式参数的对应关系
     *                 一旦使用了@RequestParam("pwd")指定了对应的key，那么该参数必须传递 否则报错
     *                 Required request parameter 'pwd' for method parameter type String is not present
     * @return
     * @RequestParam 注解属性
     * required  default  true  可以设置该注解属性的值为 false解决以上的异常问题
     * defaultValue  设置默认值
     */
    @RequestMapping("m2")
    public String method2(@RequestParam(value = "uname", required = false) String username, @RequestParam(value = "pwd", required = false, defaultValue = "666666") String password) {
        System.out.println("username = " + username + ", password = " + password);
        return "hello";
    }


    // 接收基本类型参数  int    int  id = null;  非法操作    参数是基本类型  那么该参数必须传递
    //  一般在接收基本类型参数时  会使用基本类型对应的包装类型实现参数的接收 可解决以上问题
    @RequestMapping("m3")
    public String method3(Integer id) {
        System.out.println("id = " + id);
        return "hello";
    }


    /**
     * 自定义数据类型参数的接收   请求参数中的key的名字需要和对象中属性名字保持一致 否则参数无法完成封装
     *
     * @param user
     * @return /param/m4?username=tom&password=123456&age=20    post
     * 前后端分离
     * Json数据格式传递参数  '{"username":"tom","password":"123456","age":20}'
     */
    @RequestMapping("m4")
    public String method4(User user) {

        System.out.println("user = " + user);

        return "hello";
    }

    @RequestMapping("m5")
    public String method5(Integer[] id) {

        System.out.println("Arrays.asList(id) = " + Arrays.asList(id));

        return "hello";
    }

    //  json 格式数据的接收  @RequestBody 声明参数的类型是json格式
    //  json  -> Object
    @RequestMapping("m6")
    public String method6(@RequestBody User user) {
        System.out.println("user = " + user);
        return "hello";
    }

}
